/*
 * TableFromSQL.java
 *
 * Created on 18 de febrero de 2008, 10:30
 */
package db;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import java.sql.*;
import javax.swing.JFrame;

/**
 *
 * @author  avasquez
 */
public class TableFromSQL extends JTable {

    Connection con;
    ResultSetTableModel tableModel;
    String nombretabla;

    /** Creates new form BeanForm */
    public TableFromSQL() {
    //initComponents();
    }

    public ResultSetTableModel getTableModel() {
        return tableModel;
    }

    public void setTableModel(ResultSetTableModel tableModel) {
        this.tableModel = tableModel;
    }
    
    

    
    /**Crea un anueva tabla a partir de la conexin y la consulta proporcionada
     * 
     * @param sql consulta SQl de tipo SELECT
     * @param conn conexion a la base de datos
     */
    public TableFromSQL(String sql,Connection conn) throws SQLException {
        //initComponents();
        //con = SQLManager.getConnection("jdbc:derby://localhost:1527/puebasClinica", "org.apache.derby.jdbc.ClientDriver");
        con = conn;
        setAutoCreateRowSorter(false);
        setModelFromSQL(sql);
    }

    
    public TableFromSQL(Connection conn) {
        //initComponents();
        //con = SQLManager.getConnection("jdbc:derby://localhost:1527/puebasClinica", "org.apache.derby.jdbc.ClientDriver");
        con = conn;
        setAutoCreateRowSorter(false);        
    }
    /**Este es el constructor que debe utilizarse si se desea buenos resultados
     * 
     * @param sql consulta de tipo SELECT
     * @param tabla nombre de la tabla consultada
     * @param conn conexion a la base de datos
     */
     
    public TableFromSQL(String sql, String tabla,Connection conn) throws SQLException {
        //initComponents();
        //con = SQLManager.getConnection("jdbc:derby://localhost:1527/puebasClinica", "org.apache.derby.jdbc.ClientDriver");
        con = conn;
        nombretabla = tabla;
        setModelFromSQL(sql);
        /*try {
            DatabaseMetaData dbmd = con.getMetaData();
            System.out.println(dbmd.supportsStoredProcedures());
            PreparedStatement pstmt = con.prepareStatement("{call dbo.anadirautoregistro(?)}");
            pstmt.setString(1, javax.swing.JOptionPane.showInputDialog("ingrese nombre"));
            pstmt.executeUpdate();

        } catch (SQLException ex) {
            Logger.getLogger(TableFromSQL.class.getName()).log(Level.SEVERE, null, ex);
        }*/
    }

    
    
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setModel(null);
        setFillsViewportHeight(true);
        setName("Form"); // NOI18N
    }// </editor-fold>//GEN-END:initComponents
    
    
    
    
    /**Construye un modelo a partir de una consulta
     * 
     * @param sql consulta de tipo SELECT
     */
    public void setModelFromSQL(String sql) throws SQLException {
            tableModel = new ResultSetTableModel(con, sql);
            tableModel.setTableName(nombretabla);
            this.setModel(tableModel);
    }
    
    
    public void setConnection(Connection cc){
        con=cc;
    }

    /**Construye el modelo a partir de una consulta SQL y establece los nombres de las columna
     * 
     * @param sql consulta e tipo SELECT
     * @param nombres_columna arreglo con los nombres de las columnas
     */
    public void setModelFromSQL(String sql, String[] nombres_columna) throws SQLException {
            //Connection con = SQLManager.getConnection("jdbc:derby://localhost:1527/puebasClinica", "org.apache.derby.jdbc.ClientDriver");
            tableModel = new ResultSetTableModel(con, sql);
            tableModel.setThisColumnNames(nombres_columna);
            this.setModel(tableModel);
    }

    
    /**Desconect la conxion de la base de datos
     * 
     */
    public void desconectarDB() {
        tableModel.disconnectFromDatabase();
    }

    
    
    
    /**Establece una columna editable
     * 
     * @param columna indice de columna
     * @param editable
     */
    public void setColumnEditable(int columna, boolean editable) {
        tableModel.setColumnEditable(columna, editable);
    }

    
    
    
    /**Establece un conjunto de columnas editables
     * 
     * @param columnas arreglo de indices
     * @param editable
     */ 
    public void setColumnsEditable(int[] columnas, boolean editable) {
        tableModel.setColumnsEditable(columnas, editable);
    }

    
    
    /**Añade una fila por medio de una consulta de tipo INSERT
     * luego actualiza la vista
     * @param sql consulta de tipo INSERT
     */
    public void addFila(String sql) {
            MySQLManager.ejecutarConsultaUpdate(sql);
            tableModel.actualizar();
            this.resizeAndRepaint();
    }                               

    
    /**Metodo utilizado para establecer el ancho de una columna especifica
     *
     * @param columna Indice de la columna a establecer el ancho, la primer columna tiene indice 0
     * @param ancho Ancho en pixeles de la columna
     */
    public void setAnchoColumna(int columna,int ancho){
        this.getColumn(this.getColumnName(columna)).setPreferredWidth(ancho);
    }
    
    
    public static void main(String args[]) {
        MySQLManager.InicializarConexionEstatica();
        TableFromSQL t = null;               
        try {
            t = new TableFromSQL("show tables", "usuarios", MySQLManager.getConexionEstatica());
        } catch (SQLException ex) {
            Logger.getLogger(TableFromSQL.class.getName()).log(Level.SEVERE, null, ex);
        }
        t.setColumnsEditable(new int[]{0,1}, true);
        //t.setModelFromSQL("select nombre from tabla1");
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(t);
        f.pack();
        //f.dispose();
        f.setVisible(true);
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
